經過好幾天Rails面試題的洗禮,最後來回歸基本,挑一題Ruby相關的來挑戰吧!
what is the difference between String, Symbol and Variable?
字串、符號、變數的差異是什麼?
變數與字串比較常見,大家應該能容易理解,下面就簡單介紹
在Ruby中,變數就像是一個標籤,而這個標籤會貼在某個物件上,變數本身是沒有型態的。
譬如:
name = "柏毅"
name就是變數,而這個變數就像標籤,貼在"柏毅"
這個字串(物件)上。
而字串就是用雙引號或單引號做出來的東西,如上面的範例,是String
這個類別做出來的實體。
而大多數會比較難理解的是符號(Symbol),在Ruby或是Rails中很常看到前面加上冒號的寫法(:user、 :find_user),這就是符號。
符號可以想成是有專屬名字的物件,剛開始學的時候最不能理解的就是符號跟變數有什麼不同
變數本身是標籤,因為本身沒有型態,是無法單純存在的,沒有指向任何東西的標籤是沒有意義的。
name
# => undefined local variable or method `name' for main:Object (NameError)
要使用變數必須要宣告他指向某個東西
# name變數指向123這個數字
name = 123
# name變數改成指向"hello world"這個字串
name = "hello world"
而符號是帶有名字的物件,是可以單純存在在Ruby的世界中的,符號本身有自己的名字,所以把它當作變數來指向某個物件是會出錯的。
# 不會噴錯
:name
# 噴錯
:name = 123 #=> syntax error
變數本身沒有型態,並不是個物件,只是個指向某物件的標籤或名字而已。而符號本身是有專屬名字的物件。
符號與字串有點類似,但其中的不同是,符號是不可以修改的,而字串可以。
#想將name第一個字母改成a
# 符號不能修改
:name[0] = "a" #=> undefined method `[]=' for :name:Symbol (NoMethodError)
# 字串可以修改
"name"[0] = "a" #=> a
而另一點不同是產生新的字串時,Ruby會去要新的記憶體位置,而符號並不會,利用object_id
這個方法可以看出記憶體位置
# 符號指向同一塊記憶體位置
p :name.object_id #=> 88438
p :name.object_id #=> 88438
p :name.object_id #=> 88438
# 被認為是不同字串,被放在不同記憶體位置
p "name".objec_id #=> 47147339162260
p "name".objec_id #=> 47147339162020
p "name".objec_id #=> 47147339161820
:name
記憶體位置都相同,表示是同一顆物件,而字串就不同了,即使字串的內容相同,也會被認定是不同的物件。
所以在效能上,符號的效能會略好一點,會在Hash中的key常常看到符號的出沒。
變數就像是一個標籤,而這個標籤會貼在某個物件上,變數本身是沒有型態的,並不是個物件,無法單純存活在Ruby世界中。
符號是有專屬名字的物件,前面以冒號:
開頭,而字串也是個物件,以雙引號、單引號包覆,兩者的不同為,符號是不能修改的,而字串可以。
1.為你自己學 Ruby on Rails - 符號(Symbol)